package my.projects.dda;

/**
 * @author FrankvanAssem het berekenen van de snelheidswinst en efficientie bij
 *         een paralel programa over een cluster van computers
 */

public final class Amdahl {
	public static double berekenEfficiency(double seqDeel, int aantalPC) {
		double efficiency = berekenSpeedupFactor(seqDeel, aantalPC) / aantalPC;
		return efficiency;
	}

	public static double berekenSpeedupFactor(double seqDeel, int aantalPc) {
		checkFormulaParameters(seqDeel, aantalPc);
		if (seqDeel == 0) {
			return aantalPc;
		}
		double speedupFactor = aantalPc / (1 + (seqDeel * (aantalPc - 1)));
		return speedupFactor;
	}

	private static void checkFormulaParameters(double seqDeel, int aantalPc) {
		
		if (aantalPc <= 0) {
			throw new IllegalArgumentException(
					"aantal pc  moet groter zijn dan nul");
		}
		if (seqDeel < 0 || seqDeel > 1) {
			throw new IllegalArgumentException(
					"sequentieel gedeelte mag alleen 0 tot en met 1 zijn");
		}
	}
}
